package com.java.tutorials.spring.ConfigurableListableBeanFactory;

import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.config.CustomEditorConfigurer;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

import java.beans.PropertyEditorSupport;
/**
 * Created by xuzhike on 2016/3/13.
 * File: context.xml

 <?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="
 http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans.xsd">

 <bean id="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer">
 <property name="customEditors">
 <map>
 <entry key="java.lang.Double">
 <bean class="ComplexPropertyEditor"/>
 </entry>
 </map>
 </property>
 </bean>

 <bean id="exampleBean" class="CustomEditorDemo">
 <property name="values">
 <list>
 <value>10</value>
 <value>-10</value>
 <value>10</value>
 </list>
 </property>
 </bean>

 </beans>

 * http://www.java2s.com/Code/Java/Spring/CustomEditorConfigurerandConfigurableListableBeanFactory.htm
 */
public class CustomEditorConfigurerMain {
    public static void main(String[] args) throws Exception {
        ConfigurableListableBeanFactory factory = new XmlBeanFactory(new ClassPathResource(
                "context.xml"));

        CustomEditorConfigurer configurer = (CustomEditorConfigurer) factory
                .getBean("customEditorConfigurer");
        configurer.postProcessBeanFactory(factory);

        CustomEditorDemo bean = (CustomEditorDemo) factory.getBean("exampleBean");

        System.out.println(bean.sum());
    }
}

class ComplexPropertyEditor extends PropertyEditorSupport {
    public void setAsText(String s) throws IllegalArgumentException {
        Double re = Double.parseDouble(s);
    }
}

class CustomEditorDemo {
    private double[] values;
    private double result;
    public double sum() {
        for (double value : this.values) {
            result = result + value;
        }
        return result;
    }

    public void setValues(double[] values) {
        this.values = values;
    }

}
